#ifndef SMOOTHER
#define SMOOTHER

//------------------------------------------------------------------------
//
//  Name: Smoother.h
//
//  Desc: Template class to help calculate the average value of a history
//        of values. This can only be used with types that have a 'zero'
//        value and that have the += and / operators overloaded.
//
//        Example: Used to smooth frame rate calculations.
//
//  Author: Mat Buckland (fup@ai-junkie.com)
//
//------------------------------------------------------------------------

#include <vector>

namespace CasaEngine
{

	template <class T>
	class Smoother
	{
	private:

	  //this holds the history
	  std::vector<T>  m_History;

	  int           m_iNextUpdateSlot;

	  //an example of the 'zero' value of the type to be smoothed. This
	  //would be something like Vector2D(0,0)
	  T             m_ZeroValue;

	public:

	  //to instantiate a Smoother pass it the number of samples you want
	  //to use in the smoothing, and an exampe of a 'zero' type
	  Smoother(int SampleSize, T ZeroValue):m_History(SampleSize, ZeroValue),
											m_ZeroValue(ZeroValue),
											m_iNextUpdateSlot(0)
	  {}

	  //each time you want to get a new average, feed it the most recent value
	  //and this method will return an average over the last SampleSize updates
	  T Update(const T& MostRecentValue)
	  {  
		//overwrite the oldest value with the newest
		m_History[m_iNextUpdateSlot++] = MostRecentValue;

		//make sure m_iNextUpdateSlot wraps around. 
		if (m_iNextUpdateSlot == m_History.size()) m_iNextUpdateSlot = 0;

		//now to calculate the average of the history list
		T sum = m_ZeroValue;

		typename std::vector<T>::iterator it = m_History.begin();

		for (it; it != m_History.end(); ++it)
		{
		  sum += *it;
		}

		return sum / (float)m_History.size();
	  }
	};

} // namespace CasaEngine

#endif